package br.ufrn.sipac.patrimonio.coletor.activity;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Scroller;
import android.widget.Spinner;
import br.ufrn.sipac.patrimonio.coletor.R;
import br.ufrn.sipac.patrimonio.coletor.controller.DatabaseController;
import br.ufrn.sipac.patrimonio.coletor.controller.LevantamentoController;
import br.ufrn.sipac.patrimonio.coletor.controller.MainController;
import br.ufrn.sipac.patrimonio.coletor.dominio.FinalidadeLevantamento;
import br.ufrn.sipac.patrimonio.coletor.exception.DatabaseException;
import br.ufrn.sipac.patrimonio.coletor.exception.NegocioException;
import br.ufrn.sipac.patrimonio.coletor.helper.DatabaseHelper;

/**
 * Essa activity contém permite informar os dados da finalidade do levantamento
 * feito pelo usuário.
 * 
 * @author Giuliana Silva Bezerra
 * 
 */
public class TipoLevantamentoActivity extends Activity {
	/** Armazena as finalidades existentes em memória. */
	private Spinner spinnerFinalidades;
	/** Contém os itens do spinnerFinalidades. */
	private List<FinalidadeLevantamento> listaFinalidades = new ArrayList<FinalidadeLevantamento>();
	/**
	 * Encaminha para a próxima activity no fluxo
	 * (CadastroLevantamentoLocalidadeActivity).
	 */
	private Button continuar;
	/** Retorna para a activity anterior (MenuActivity). */
	private Button voltar;
	/** Contém a descrição da finalidade selecionada. */
	private EditText descricao;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_tipo_levantamento);

		// Mapear os componente da tela
		spinnerFinalidades = (Spinner) findViewById(R.id.spinner1);
		descricao = (EditText) findViewById(R.id.editText2);
		continuar = (Button) findViewById(R.id.button1);
		voltar = (Button) findViewById(R.id.button2);

		// Configura componentes
		Scroller scroll = new Scroller(this);
		descricao.setScroller(scroll);
		descricao.setVerticalScrollBarEnabled(true);
		descricao.setMovementMethod(new ScrollingMovementMethod());

		descricao.setVerticalScrollBarEnabled(true);
		Collection finalidades = carregaFinalidades();

		if (finalidades != null && finalidades.size() > 0
				&& listaFinalidades.isEmpty())
			listaFinalidades.addAll(finalidades);

		// Carrega dados localmente: Adiciona a opção de seleção
		if (listaFinalidades.isEmpty()) {
			FinalidadeLevantamento finalidade = new FinalidadeLevantamento(0);
			finalidade.setDenominacao("--SELECIONE--");
			listaFinalidades.add(finalidade);
			conectaBD();
		}

		// Cria um ArrayAdapter usando um padrão de layout da classe R do
		// android, passando o ArrayList com as finalidades e as unidades
		ArrayAdapter<FinalidadeLevantamento> arrayAdapter = new ArrayAdapter<FinalidadeLevantamento>(
				this, android.R.layout.simple_spinner_dropdown_item,
				listaFinalidades);
		arrayAdapter
				.setDropDownViewResource(android.R.layout.simple_spinner_item);
		spinnerFinalidades.setAdapter(arrayAdapter);

		// Adicionar listeners dos componentes
		continuar
				.setOnClickListener(new CadastroLevantamentoLocalidadeListener());
		voltar.setOnClickListener(new VoltarMenuListener());
	}

	private Collection carregaFinalidades() {
		Collection finalidades = null;
		try {
			finalidades = DatabaseHelper.getHelper(this).getFinalidadeDAO()
					.queryForAll();
		} catch (SQLException e) {
			new NegocioException("Não há tipos de levantamentos cadastrados.",
					this);
		}
		return finalidades;
	}

	/**
	 * Conecta ou cria o banco de dados se ele ainda não existir.
	 */
	@SuppressWarnings("unchecked")
	private void conectaBD() {
		try {
			listaFinalidades
					.addAll((Collection<? extends FinalidadeLevantamento>) DatabaseController
							.getAllFinalidades(this));

		} catch (DatabaseException e) {
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.tipo_levantamento, menu);
		return true;
	}

	/**
	 * Carrega menu da aplicação.
	 */
	private void iniciaMenu() {
		finish();
		Intent intent = new Intent(this, MenuActivity.class);
		startActivity(intent);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.item2:
			iniciaMenu();
		case R.id.item1:
			finish();
		}
		return false;
	}

	/**
	 * Inicia a activity de cadastro de localidade.
	 * 
	 * @throws NegocioException
	 * 
	 * @see CadastroLevantamentoLocalidadeActivity
	 */
	public void iniciarCadastroLevantamentoLocalidade() throws NegocioException {
		FinalidadeLevantamento finalidade = (FinalidadeLevantamento) spinnerFinalidades
				.getSelectedItem();
		// É necessário escolher a finalidade do levantamento
		if (finalidade.getId() == 0)
			throw new NegocioException("Finalidade não informada.", this);

		LevantamentoController.getInstance().getLevantamento().setTipo(finalidade);
		LevantamentoController.getInstance().getLevantamento().setDescricao(descricao.getText().toString());

		// Redireciona para a tela de cadastro de localidade
		Intent intent = new Intent(this,
				CadastroLevantamentoLocalidadeActivity.class);
		finish();
		startActivity(intent);
	}

	/**
	 * Listener que lida com o encaminhamento para tela de escolha da localidade
	 * do levantamento.
	 */
	public class CadastroLevantamentoLocalidadeListener implements
			Button.OnClickListener {
		@Override
		public void onClick(View arg0) {
			try {
				iniciarCadastroLevantamentoLocalidade();
			} catch (NegocioException e) {
			}
		}
	}

	/**
	 * Listener que lida com o encaminhamento para a tela do menu principal.
	 */
	public class VoltarMenuListener implements Button.OnClickListener {
		@Override
		public void onClick(View arg0) {
			iniciaMenu();
		}
	}

	@Override
	public void onBackPressed() {
		// Desabilita botão voltar.
	}
}
